/**
给定一个函数 fn ，一个参数数组 args 和一个以毫秒为单位的超时时间 t ，返回一个取消函数 cancelFn 。
在 cancelTimeMs 的延迟后，返回的取消函数 cancelFn 将被调用。
setTimeout(cancelFn, cancelTimeMs)
最初，函数 fn 的执行应该延迟 t 毫秒。
如果在 t 毫秒的延迟之前调用了函数 cancelFn，它应该取消 fn 的延迟执行。
否则，如果在指定的延迟 t 内没有调用 cancelFn，
则应执行 fn，并使用提供的 args 作为参数
=====在执行之前掉用取消，则停止执行=====
示例 1:
输入：fn = (x) => x * 5, args = [2], t = 20
输出：[{"time": 20, "returned": 10}]
解释：
const cancelTimeMs = 50;
const cancelFn = cancellable((x) => x * 5, [2], 20);
setTimeout(cancelFn, cancelTimeMs);
取消操作被安排在延迟了 cancelTimeMs（50毫秒）后进行，这发生在 fn(2) 在20毫秒时执行之后。
 */

var cancellable = function(fn, args, t) {
  let isCancelled = false;
  setTimeout(()=>{
    !isCancelled && fn(...args);
  },t)
  return function() {
   isCancelled = true;
  }
};

